bitkeeper revision 1.122.1.12 (3e70c222sMX-OidE6LMQKldyEgrYWg)
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 13 Mar 2003 17:38:42 +0000 (17:38 +0000)
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>
Thu, 13 Mar 2003 17:38:42 +0000 (17:38 +0000)
xl_segment.c, xl_scsi.c, xl_ide.c:
  Fix IDE/SCSI so that will not segfault on accessing non-existent devices.

xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_ide.c
xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_scsi.c
xenolinux-2.4.21-pre4-sparse/arch/xeno/drivers/block/xl_segment.c

index 70990167e3f6c0134ff369b18aa2d36f8bc8e0b6..5e96f4197ba97cb097f5b86cf2bc75226a613944 100644 (file)
@@ -18,7 +18,7 @@ static int xlide_blksize_size[XLIDE_MAX];
 static int xlide_hardsect_size[XLIDE_MAX];
 static int xlide_max_sectors[XLIDE_MAX];
 
-struct gendisk *xlide_gendisk;
+struct gendisk *xlide_gendisk = NULL;
 
 static struct block_device_operations xlide_block_fops = 
 {
@@ -41,6 +41,13 @@ int xlide_init(xen_disk_info_t *xdi)
     int i, result, units, minors, disk;
     struct gendisk *gd;
 
+    /* If we don't have any usable IDE devices we may as well bail now. */
+    units = 0;
+    for ( i = 0; i < xdi->count; i++ )
+        if ( IS_IDE_XENDEV(xdi->disks[i].device) &&
+             ((xdi->disks[i].device & XENDEV_IDX_MASK) < 16) ) units++;
+    if ( units == 0 ) return 0;
+
     SET_MODULE_OWNER(&xlide_block_fops);
 
     result = register_blkdev(XLIDE_MAJOR, XLIDE_MAJOR_NAME, 
@@ -73,13 +80,6 @@ int xlide_init(xen_disk_info_t *xdi)
      */
     blk_queue_headactive(BLK_DEFAULT_QUEUE(XLIDE_MAJOR), 0);
 
-    /* If we don't have any usable IDE devices we may as well bail now. */
-    units = 0;
-    for ( i = 0; i < xdi->count; i++ )
-        if ( IS_IDE_XENDEV(xdi->disks[i].device) &&
-             ((xdi->disks[i].device & XENDEV_IDX_MASK) < 16) ) units++;
-    if ( units == 0 ) return 0;
-
     /* We may register up to 16 devices in a sparse identifier space. */
     units = 16;
 
@@ -133,6 +133,8 @@ int xlide_init(xen_disk_info_t *xdi)
 
 void xlide_cleanup(void)
 {
+    if ( xlide_gendisk == NULL ) return;
+
     blk_cleanup_queue(BLK_DEFAULT_QUEUE(XLIDE_MAJOR));
 
     xlide_gendisk = NULL;
index 75e379f1bac158f4535e397f1fbe84d4a023814a..f765d3f12e31fde90bea7d69d581443ad21d9e13 100644 (file)
@@ -42,6 +42,13 @@ int xlscsi_init(xen_disk_info_t *xdi)
     int i, result, units, minors, disk;
     struct gendisk *gd;
 
+    /* If we don't have any usable SCSI devices we may as well bail now. */
+    units = 0;
+    for ( i = 0; i < xdi->count; i++ )
+        if ( IS_SCSI_XENDEV(xdi->disks[i].device) &&
+             ((xdi->disks[i].device & XENDEV_IDX_MASK) < 16) ) units++;
+    if ( units == 0 ) return 0;
+
     SET_MODULE_OWNER(&xlscsi_block_fops);
 
     result = register_blkdev(XLSCSI_MAJOR, XLSCSI_MAJOR_NAME, 
@@ -74,13 +81,6 @@ int xlscsi_init(xen_disk_info_t *xdi)
      */
     blk_queue_headactive(BLK_DEFAULT_QUEUE(XLSCSI_MAJOR), 0);
 
-    /* If we don't have any usable SCSI devices we may as well bail now. */
-    units = 0;
-    for ( i = 0; i < xdi->count; i++ )
-        if ( IS_SCSI_XENDEV(xdi->disks[i].device) &&
-             ((xdi->disks[i].device & XENDEV_IDX_MASK) < 16) ) units++;
-    if ( units == 0 ) return 0;
-
     /* We may register up to 16 devices in a sparse identifier space. */
     units = 16;
 
@@ -134,6 +134,8 @@ int xlscsi_init(xen_disk_info_t *xdi)
 
 void xlscsi_cleanup(void)
 {
+    if ( xlscsi_gendisk == NULL ) return;
+
     blk_cleanup_queue(BLK_DEFAULT_QUEUE(XLSCSI_MAJOR));
 
     xlscsi_gendisk = NULL;
index 8626a3656991f136e06ea38b77e77d7434eb8cfa..6ef1838a2b87b669d4012008df0fd08a86d7d2de 100644 (file)
@@ -21,7 +21,7 @@ static int xlseg_blksize_size[XLVIRT_MAX];
 static int xlseg_hardsect_size[XLVIRT_MAX];
 static int xlseg_max_sectors[XLVIRT_MAX];
 
-struct gendisk *xlsegment_gendisk;
+struct gendisk *xlsegment_gendisk = NULL;
 
 static xen_disk_info_t xlseg_disk_info;
 
@@ -148,6 +148,8 @@ int __init xlseg_init(void)
 
 static void __exit xlseg_cleanup(void)
 {
+    if ( xlsegment_gendisk == NULL ) return;
+
     blk_cleanup_queue(BLK_DEFAULT_QUEUE(XLVIRT_MAJOR));
 
     xlsegment_gendisk = NULL;